/** Fichier définissant un environnement, composé d'objets et de
 * sources lumineuses.
 *
 * Ce fichier contient la déclaration de la classe Environnement
 *
 * @file Environnement.hpp
 * @author Jean-Marc Comby + Romain Dequesne
 * @author Johan "Solo" Luisier
 *
 * @date 14 Mai 2004
 */
#ifndef _ENV_H
#define _ENV_H

//#include <iostream>
#include <vector>

#include "Couleur.hpp"

#include "Objet.hpp"

#include "Rayon.hpp"

#include "Lumieres/Lumiere.hpp"

//#include "perlin.hpp"
//#include "Image.hpp"

/** Classe permettant de définir une scène, comportant des objets et
 * des sources de lumière.
 *
 * L'Environnement possède une Couleur de fond, qui est utilisée
 * lorsque le Rayon n'intersecte aucun Objet.
 *
 * @author Jean-Marc Comby + Romain Dequesne
 * @author Johan "Solo" Luisier
 *
 * @date 14 Mai 2004
 *
 * @class Environnement "Environnement.hpp" "Environnement.hpp"
 */
class Environnement
{
 public:
  //constructeurs et destructeurs
  Environnement(const Couleur& col = Couleur()); // environnement avec fond uni
  virtual ~Environnement();
  //methode d'ajout suppression
  void ajouterLumiere( Lumiere* lum );
  void supprimerDerniereLumiere();
  void supprimerLumieres();
  void ajouterObjet( Objet* obj );
  void supprimerDernierObjet();
  void supprimerObjets();
  const Couleur& fond() const;
  void setFond( const Couleur& couleur );
  //methodes du lancer de rayons
  Couleur lanceRayon(const Rayon &ray, unsigned const int&, double indice,
		     const bool& dbg = false);
  void affiche() const;
private:
  int trouvePremierObjet(const Rayon&, Coord&); //on est interesse par l'intersection
  // lumière diffuse deux coord d'intersection, une modifier pour eviter les points noirs.
  Couleur calculeLumiereDiffusee(const Coord &, const Coord &,
			  unsigned const int &nofig, const Rayon &,
			  const VecteurU &normal, const bool& dbg = false);
  Couleur calculeLumiereReflechie(const Coord &, unsigned const int&, const int &,
		    const Rayon &, const VecteurU &normal);
  Couleur calculeLumiereRefractee(Coord, unsigned const int&, const Rayon &,
		     unsigned const int&, const double &indice,
		     const VecteurU &normal);
  /**
   * Conteneur des sources de lumières.
   */
  std::vector< Lumiere* > Lumieres;
  /**
   * Conteneur des objets.
   */
  std::vector< Objet* > Scene;
  /**
   * Couleur de fond, qui est utilisée lorsqu'aucune intersection
   * n'est trouvée.
   */
  Couleur Fond;
  // calcul la distance entre deux coord
  double distance(const Coord&, const Coord&);
};

#endif
